home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Libraries / GUSI / Examples / GUSISocketTest.c < prev    next >
Text File  |  1992-09-11  |  4KB  |  200 lines

  1. /*********************************************************************
  2. File        :    GUSI                    -    Grand Unified Socket Interface
  3. File        :    GUSISocketTest.c    -    Socket testing gear
  4. Author    :    Matthias Neeracher <neeri@iis.ethz.ch>
  5. Started    :    25Jul92                                Language    :    MPW C
  6.                 08Sep92    MN    Factor out more common code
  7. Last        :    08Sep92
  8. *********************************************************************/
  9.  
  10. #include <GUSI.h>
  11. #include <GUSITest.h>
  12. #include <Types.h>
  13. #include <stdio.h>
  14. #include <fcntl.h>
  15. #include <string.h>
  16. #include <sys/errno.h>
  17.  
  18. int    sock        =    -1;
  19. int    accsock    =    -1;
  20.  
  21. void Close(char, char, const char *)
  22. {
  23.     if (close(sock))    {
  24.         printf("# close() returned error %s\n", Explain());
  25.         Where();
  26.     }
  27.     
  28.     sock        =    accsock;
  29.     accsock    =    -1;
  30. }
  31.  
  32. void Listen(char, char, const char *)
  33. {
  34.     if (sock == -1)    {
  35.         printf("# socket is not open\n");
  36.         Where();
  37.         
  38.         return;
  39.     }
  40.  
  41.     if (listen(sock, 5))    {
  42.         printf("# listen() returned error %s\n", Explain());
  43.         Where();
  44.     }
  45. }
  46.  
  47. void Write(char, char, const char * line)
  48. {
  49.     int len    =    strlen(line);
  50.     int part;
  51.  
  52.     if (sock == -1)    {
  53.         printf("# socket is not open\n");
  54.         Where();
  55.             
  56.         return;
  57.     }
  58.     
  59.     for (; len; len -= part, line += part) {
  60.         part = write(sock, line, len);
  61.         if (part < 0)    {
  62.             printf("# write(\"%s\") returned error %s\n", line, Explain());
  63.             Where();
  64.             
  65.             break;
  66.         }        
  67.     }
  68. }
  69.  
  70. void Read(char, char, const char *)
  71. {
  72.     int        len;
  73.     char         buf[500];
  74.     char *    line;
  75.     
  76.     if (sock == -1)    {
  77.         printf("# socket is not open\n");
  78.         Where();
  79.             
  80.         return;
  81.     }
  82.  
  83.     len    =    read(sock, buf, 500);
  84.     
  85.     if (len < 0)    {
  86.         printf("# read() returned error %s\n", Explain());
  87.     } else {
  88.         buf[len] = 0;
  89.         printf("# read() returned:\n");
  90.         
  91.         for (line = strtok(buf, "\n\r"); line; line = strtok(nil, "\n\r"))
  92.             printf("# %s\n", line);
  93.     }
  94.     
  95.     Where();
  96. }
  97.  
  98. void Select(char, char, const char *)
  99. {
  100.     int                res;
  101.     fd_set            rdfds;
  102.     fd_set            wrfds;
  103.     fd_set            exfds;
  104.     struct timeval    delay;
  105.     
  106.     if (sock == -1)    {
  107.         printf("# socket is not open\n");
  108.         Where();
  109.             
  110.         return;
  111.     }
  112.     
  113.     FD_ZERO(&rdfds);
  114.     FD_ZERO(&wrfds);
  115.     FD_ZERO(&exfds);
  116.     
  117.     FD_SET(sock, &rdfds);
  118.     FD_SET(sock, &wrfds);
  119.     FD_SET(sock, &exfds);
  120.     
  121.     delay.tv_sec    =    10;
  122.     delay.tv_usec    =    0;
  123.     
  124.     res = select(sock+1, &rdfds, &wrfds, &exfds, &delay);
  125.     
  126.     if (res < 0)    {
  127.         printf("# select() returned error %s\n", Explain());
  128.     } else if (!res) {
  129.         printf("# select() timed out\n");
  130.     } else {
  131.         printf(
  132.             "# select() returned %s%s%s\n", 
  133.             FD_ISSET(sock, &rdfds) ? "canRead " : "",
  134.             FD_ISSET(sock, &wrfds) ? "canWrite " : "",
  135.             FD_ISSET(sock, &exfds) ? "exception " : "");
  136.     }
  137.     
  138.     Where();
  139. }
  140.  
  141. void TogBlk(char, char, const char *)
  142. {
  143.     int    block;
  144.     
  145.     switch (fcntl(sock, F_GETFL, 0))    {
  146.     case 0:
  147.         block    =    1;
  148.         break;
  149.     default:
  150.         block =     0;
  151.         break;
  152.     case -1:
  153.         printf("# fcntl(F_GETFL) returned error %s\n", Explain());
  154.         Where();
  155.         
  156.         return;
  157.     }
  158.     
  159.     if (ioctl(sock, FIONBIO, &block))
  160.         printf(
  161.             "# ioctl(FIONBIO, %s) returned error %s\n", 
  162.             block ? "true" : "false", 
  163.             Explain());
  164.     else
  165.         printf("# Socket is now %s\n", block ? "nonblocking" : "blocking");
  166.     
  167.     Where();
  168. }
  169.  
  170. void NRead(char, char, const char *)
  171. {
  172.     int    nread;
  173.     
  174.     if (ioctl(sock, FIONREAD, &nread))
  175.         printf("# ioctl(FIONREAD) returned error %s\n", Explain());
  176.     else
  177.         printf("# %d bytes waiting to be read\n", nread);
  178.     
  179.     Where();
  180. }
  181.  
  182. void AddSocketCommands()
  183. {
  184.     COMMAND('l', 'i', Listen,  "",                 "Listen to socket");
  185.     COMMAND('c', 'l', Close,      "",                 "Close socket");
  186.     COMMAND('w', 'r', Write,     "text",             "Write a line");
  187.     COMMAND('r', 'd', Read,      "",                 "Read");
  188.     COMMAND('s', 'e', Select,  "",                 "Select a socket");
  189.     COMMAND('t', 'b', TogBlk,  "",                 "Toggle blocking status");
  190.     COMMAND('n', 'r', NRead,    "",                "Number of bytes to be read");
  191. }
  192.  
  193. void CleanupSockets()
  194. {
  195.     if (sock != -1)
  196.         close(sock);
  197.     if (accsock != -1)
  198.         close(accsock);
  199. }
  200.